home *** CD-ROM | disk | FTP | other *** search
- #include "tcclib.h"
- #include <string.h>
- #include <stdlib.h>
- #include <conio.h>
- #include <ctype.h>
- #include <stdio.h>
-
- void VertMenu( MenuRec MP[], int numchoices, int x, int y, int xx, int yy )
- {
- register int i, ptr=0, longest=0;
- int begx, begy;
- int ch;
- char *screen;
-
- for (i=0; i<numchoices; ++i) {
- if ( strlen( MP[i].Item ) > longest )
- longest = strlen( MP[i].Item );
- }
-
- begx = x;
- begy = y;
- while ( begx+1+longest > 80 ) begx--;
- while ( begy+1+numchoices > 25 ) begy--;
- if ( begx < 0 ) begx = 0;
- if ( begy < 0 ) begy = 0;
- screen = (char *) calloc( 4000, 1 );
- GetScreen( screen );
- ExplodeBox( begx, begy, begx+1+longest, begy+1+numchoices );
- for (i=0; i<numchoices; ++i)
- AtSay( begx+1, begy+1+i, MP[i].Item );
- for (;;) {
- ChangeBlock( begx, begy, begx+1+longest, numchoices+begy+1, 0x07 );
- ChangeBlock( begx+1, begy+1+ptr, begx+longest, begy+1+ptr, 0x70 );
- AtSay( xx, yy, MP[ptr].Desc );
- switch( ch = GComm() ) {
- case CR:
- if ( -1 == MP[ptr].func() ) {
- PutScreen( screen );
- free( screen );
- return;
- }
- break;
- case ESC:
- PutScreen( screen );
- free( screen );
- return;
- case DOWN:
- if ( ++ptr >= numchoices )
- ptr = 0;
- break;
- case UP:
- if ( --ptr < 0 )
- ptr = numchoices - 1;
- break;
- default:
- i = ptr + 1;
- while ( i != ptr ) {
- if ( i >= numchoices ) i = 0;
- if ( toupper(MP[i].Item[0]) == toupper(ch) ||
- MP[i].FuncKey == ch ) {
- ptr = i;
- break;
- }
- i++;
- }
- break;
- }
- }
- }